Skip to main content

BPMN - Handle External Task

Persiapan

  1. BPMN (dengan send task atau external task)
  2. Deploy BPMN
  3. Siapkan instances pada send task atau external task

picture 1

Kode

Melanjutkan dari project gin silahkan buat file BPMN/externalTask.go. Struktur folder project akan seperti ini :

picture 2

Pasang Camunda REST API Client, dengan menjalankan command berikut ini pada terminal :

go get github.com/citilinkru/camunda-client-go/v3

Buka file externalTask.go tambahkan function HandleExternalTask.

import (
"fmt"
camunda_client_go "github.com/citilinkru/camunda-client-go/v3"
"github.com/citilinkru/camunda-client-go/v3/processor"
"time"
)

func HandleExternalTask() {

//create client
client := camunda_client_go.NewClient(camunda_client_go.ClientOptions{
EndpointUrl: "http://localhost:8082/engine-rest",
ApiUser: "demo",
ApiPassword: "demo",
Timeout: time.Second * 10,
})

//create external task processor
logger := func(err error) {
fmt.Println(err.Error())
}

proc := processor.NewProcessor(client, &processor.Options{
WorkerId: "worker1",
LockDuration: time.Second * 5,
MaxTasks: 10,
MaxParallelTaskPerHandler: 100,
}, logger)

//add and subscribe external task handler
proc.AddHandler(
[]*camunda_client_go.QueryFetchAndLockTopic{
{
TopicName: "notifAduanDibuatSekretariatTU",
},
},
func(ctx *processor.Context) error {
fmt.Printf("Running task %s. WorkerId: %s. TopicName: %s\n", ctx.Task.Id, ctx.Task.WorkerId, ctx.Task.TopicName)

err := ctx.Complete(processor.QueryComplete{
Variables: &map[string]camunda_client_go.Variable{
"result": {Value: "Hello world!", Type: "string"},
},
})

var retryTimeout int
var retries int
var errTxt string
if err != nil {
fmt.Printf("Error set complete task %s: %s\n", ctx.Task.Id, err)

return ctx.HandleFailure(processor.QueryHandleFailure{
ErrorMessage: &errTxt,
Retries: &retries,
RetryTimeout: &retryTimeout,
})
}

fmt.Printf("Task %s - %s completed\n", ctx.Task.Id, ctx.Task.TopicName)
return nil
},
)
}
  1. Create Client

    Pada bagian ini, silahkan ada sesuaikan dengan setting camunda cockpit anda.

    client := camunda_client_go.NewClient(camunda_client_go.ClientOptions{
    EndpointUrl: "http://localhost:8082/engine-rest",
    ApiUser: "demo",
    ApiPassword: "demo",
    Timeout: time.Second * 10,
    })
    ```
  2. Create external task processor

    Pada bagian ini, silahkan atur workerId yang ingin anda gunakan.

    proc := processor.NewProcessor(client, &processor.Options{
    WorkerId: "worker1",
    LockDuration: time.Second * 5,
    MaxTasks: 10,
    MaxParallelTaskPerHandler: 100,
    }, logger)
  3. Add and subscribe external task handler

    Pada bagian ini, silahkan sesuaikan nama topic, sesuai dengan BPMN anda.

    proc.AddHandler(
    []*camunda_client_go.QueryFetchAndLockTopic{
    {
    TopicName: "notifAduanDibuatSekretariatTU",
    },
    },
    ...

Setelah membuat function tersebut, silahkan menuju ke file example.go atau main, lalu panggil function tadi di dalam main.

package main

import (
"example/hello/BPMN"
"github.com/gin-gonic/gin"
)

func main() {

//call handle external task function
BPMN.HandleExternalTask()

r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello world",
})
})
err := r.Run()
if err != nil {
return
} // listen and serve on 0.0.0.0:8080
}

Lalu, jalankan project golang anda, jika berjalan sukses, anda dapat memeriksa log, dan mendapatkan pesan seperti ini. Running Task Completed.

picture 3

picture 4

referensi :

Camunda REST API Client for Golang